import sys

import pandas
from PySide6.QtWidgets import *
from PySide6.QtCore import Qt, QSize
from PySide6.QtGui import QAction, QIcon



class GeologyAnalysisApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_ui()
        self.setup_dock_widgets()
        self.setup_central_area()
        self.setup_connections()

    def init_ui(self):
        self.setWindowTitle("三维地质勘探分析系统")
        self.setGeometry(100, 100, 1280, 720)
        self.setup_toolbar()
        self.statusBar().showMessage("就绪")

    def setup_toolbar(self):
        toolbar = self.addToolBar("主工具栏")
        toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)

        # 工具栏动作
        actions = [
            ("导入数据", "document-open", self.import_data),#解释这个参数:导入数据,图标,导入数据方法
            ("清空", "edit-clear", self.clear_data),
            ("导出", "document-save", self.export_data),
            ("3D视图", "3d", self.toggle_3d_view),
            ("表格", "table", self.toggle_table_view)
        ]

        for text, icon_name, handler in actions:#解释函数作用:循环添加工具栏按钮并连接槽
            action = QAction(QIcon.fromTheme(icon_name), text, self)#解释函数作用:创建一个动作
            action.triggered.connect(handler)#解释函数作用:连接动作的触发信号到槽
            toolbar.addAction(action)#解释函数作用:添加动作到工具栏

    def setup_dock_widgets(self):
        # 左侧树形视图（带折叠按钮）
        self.left_dock = CollapsibleDockWidget("勘探记录项", self)
        self.tree = QTreeWidget()
        self.tree.setHeaderHidden(True)
        self.populate_tree()
        self.left_dock.setWidget(self.tree)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.left_dock)

        # 右侧属性面板（带折叠按钮）
        self.right_dock = CollapsibleDockWidget("属性详情", self)
        self.property_grid = QTableWidget(0, 2)
        self.setup_property_grid()
        self.right_dock.setWidget(self.property_grid)
        self.addDockWidget(Qt.RightDockWidgetArea, self.right_dock)

    def setup_central_area(self):
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        main_layout = QVBoxLayout(central_widget)
        main_layout.setContentsMargins(5, 5, 5, 5)

        # 3D视图区域
        self.view_3d = QLabel("3D 可视化区域（模拟）")#解释"""这个是什么意思:多行字符串
        self.view_3d.setStyleSheet("""
            background: #1e1e1e;
            color: #fff;
            font-size: 18px;
            padding: 20px;
        """)
        self.view_3d.setAlignment(Qt.AlignCenter)

        # 数据表格控制栏
        table_control = QWidget()
        table_control_layout = QHBoxLayout(table_control)
        self.toggle_table_btn = QPushButton("隐藏表格")
        self.refresh_btn = QPushButton("刷新数据")
        table_control_layout.addWidget(self.toggle_table_btn)
        table_control_layout.addWidget(self.refresh_btn)

        # 数据表格
        self.data_table = QTableWidget()#解释函数作用:创建一个表格
        self.setup_data_table()#解释函数作用:配置数据表格
        self.setup_table()
        self.setup_context_menu()

        # 使用QSplitter管理垂直布局
        splitter = QSplitter(Qt.Vertical)
        splitter.addWidget(self.view_3d)
        splitter.addWidget(self.data_table)
        splitter.setChildrenCollapsible(False)

        main_layout.addWidget(splitter)
        main_layout.addWidget(table_control)

    def setup_connections(self):
        self.tree.itemClicked.connect(self.update_property_view)
        self.toggle_table_btn.clicked.connect(self.toggle_table_visibility)

    def populate_tree(self):
        """初始化示例树形数据"""
        root = QTreeWidgetItem(self.tree, ["钻孔数据"])
        layers = [
            ("MG1", "红粘土层", "#ff0000"),
            ("MG2", "砂质土层", "#00ff00"),
            ("MG3", "基岩层", "#0000ff")
        ]
        for code, name, color in layers:
            item = QTreeWidgetItem([f"{code} - {name}"])
            item.setData(0, Qt.UserRole, color)
            root.addChild(item)
        self.tree.expandAll()

    def setup_property_grid(self):
        """配置属性表格"""
        self.property_grid.setHorizontalHeaderLabels(["属性", "值"])
        self.property_grid.horizontalHeader().setStretchLastSection(True)
        self.property_grid.verticalHeader().setVisible(False)
        self.property_grid.setEditTriggers(QTableWidget.NoEditTriggers)
        self.property_grid.setColumnWidth(0, 150)

    def setup_data_table(self):
        """配置数据表格"""
        headers = ["层号", "地层类型", "承载力(kPa)", "内摩阻角(°)", "地下水位(m)","备注", "承载力(kPa)", "内摩阻角(°)", "地下水位(m)","备注"]
        self.data_table.setColumnCount(len(headers))
        self.data_table.setHorizontalHeaderLabels(headers)
        self.data_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)#解释:设置表格的列宽自适应

        # 示例数据
        self.load_sample_data()

    def load_sample_data(self):
        data = [
            ["MG1", "红粘土", 140, 35, 2.5],
            ["MG2", "砂质土", 240, 42, 3.0],
            ["MG3", "基岩", 500, 48, 4.2]
        ]
        self.data_table.setRowCount(len(data))
        for row, items in enumerate(data):
            for col, value in enumerate(items):
                self.data_table.setItem(row, col, QTableWidgetItem(str(value)))

    def setup_table(self):
        self.data_table.setSelectionMode(QTableWidget.ContiguousSelection)#解释ContiguousSelection:连续选择
        self.data_table.setEditTriggers(QTableWidget.DoubleClicked)#DoubleClicked:双击编辑

    def setup_context_menu(self):
        self.data_table.setContextMenuPolicy(Qt.ActionsContextMenu)#解释:设置表格的上下文菜单策略
        paste_action=QAction("粘贴Excel数据",self)
        paste_action.triggered.connect(self.paste_excel_data)#解释:连接动作的触发信号到槽
        self.data_table.addAction(paste_action)

    def paste_excel_data(self):
        clipboard=QApplication.clipboard()#解释:获取剪贴板
        data=clipboard.text()
        if not data:
            return
        #获取当前选中单元格位置
        current_row=self.data_table.currentRow()
        current_col=self.data_table.currentColumn()
        #解析剪贴板数据
        rows=data.split('\n')#解释:按换行符分割
        for i,row in enumerate(rows):
            if not row:#解释:如果
                continue#解释:跳过
            column=row.split('\t')#解释:按制表符分割
            #在处理从 Excel 或其他表格软件复制的数据时，数据通常以制表符（\t）分隔。
            # 制表符是表格数据中常用的分隔符，用于区分不同的列。因此，使用 split('\t') 可以将一行数据按列分割成多个部分。
            for j,value in enumerate(column):
                target_row=current_row+i
                target_column=current_col+j

                #动态扩展表格
                if target_row>=self.data_table.rowCount():
                    self.data_table.insertRow(target_row)
                if target_column>=self.data_table.columnCount():
                    self.data_table.insertRow(target_column)

                #设置单元格数据
                item=QTableWidgetItem(value.strip())#解释:strip()方法用于移除字符串头尾指定的字符（默认为空格或换行符）或字符序列。
                self.data_table.setItem(target_row,target_column,item)




    def update_property_view(self, item):
        """更新属性表格内容"""
        self.property_grid.setRowCount(0)#解释:设置表格的行数

        # 示例属性数据
        properties = {
            "MG1 - 红粘土层": [
                ("地层代码", "MG1"),
                ("地层类型", "红粘土"),
                ("承载力", "140 kPa"),
                ("内摩阻角", "35°"),
                ("临界深度", "2.5 m")
            ],
            # 其他层数据...
        }

        if item.text(0) in properties:#解释:判断item.text(0)是否在properties中
            for prop in properties[item.text(0)]:#解释:遍历properties中的属性
                row = self.property_grid.rowCount()
                self.property_grid.insertRow(row)
                self.property_grid.setItem(row, 0, QTableWidgetItem(prop[0]))
                self.property_grid.setItem(row, 1, QTableWidgetItem(prop[1]))

    def toggle_table_visibility(self):
        """切换表格可见性"""
        visible = self.data_table.isVisible()
        self.data_table.setVisible(not visible)
        self.toggle_table_btn.setText("显示表格" if visible else "隐藏表格")

    # 以下为功能占位方法
    def import_data(self):
                        file_path, _ = QFileDialog.getOpenFileName(QWidget(self), "选择 Excel 文件", "C:\\", "Excel Files (*.xls *.xlsx)")
                        if file_path:
                            try:
                                self.df = pandas.read_excel(file_path)
                                self.data_table.setRowCount(len(self.df))

                                # 限制列数不超过表格的列数
                                max_cols = min(len(self.df.columns), self.data_table.columnCount())

                                for row in range(len(self.df)):
                                    for col in range(max_cols):
                                        # 防止空值导致的错误
                                        value = self.df.iat[row, col] if not pandas.isna(self.df.iat[row, col]) else ""
                                        self.data_table.setItem(row, col, QTableWidgetItem(str(value)))

                                self.statusBar().showMessage(f"成功导入 {len(self.df)} 行数据")
                            except Exception as e:
                                QMessageBox.critical(self, "导入错误", f"导入Excel文件时出错：{str(e)}")
                    # 解释:设置表格的单元格 几个参数:行,列,单元格内容
                    # 解释:df.iat[row, col]是pandas库的方法,用于获取DataFrame的某个单元格的值

    def clear_data(self):
        self.tree.clear()
        self.property_grid.setRowCount(0)
        self.data_table.setRowCount(0)

    def export_data(self):
        pass

    def toggle_3d_view(self):
        pass

    def toggle_table_view(self):
        pass


class CollapsibleDockWidget(QDockWidget):
    """可折叠的停靠窗口"""

    def __init__(self, title, parent=None):
        super().__init__(title, parent)
        self.setFeatures(QDockWidget.DockWidgetClosable |
                         QDockWidget.DockWidgetMovable |
                         QDockWidget.DockWidgetFloatable)
        #设置停靠窗口的特性: self.setFeatures(QDockWidget.DockWidgetClosable | QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) 这行代码设置停靠窗口的特性，使其可以关闭、移动和浮动。
        self.toggle_action = self.toggleViewAction()#这行代码获取停靠窗口的切换视图动作。
        self.toggle_action.setText("切换侧边栏" if "记录项" in title else "切换属性栏")
        #这行代码设置切换动作的文本，如果标题中包含“记录项”，则文本为“切换侧边栏”，否则为“切换属性栏”。


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = GeologyAnalysisApp()
    window.show()
    sys.exit(app.exec())
